package es.aqua.aquac.util;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;

public class Roles implements Serializable {

	/**
	 * Rol de Administrador
	 */
	public static final String ROLE_ADMIN = "ROLE_ADMIN";
	/**
	 * Rol de Propietario
	 */
	public static final String ROLE_PROP = "ROLE_PROPIETARIO";

	/**
	 * 
	 */
	private static final long serialVersionUID = -7268462293423450235L;

	/**
	 * Atributo que indica el id del Usuario Logado
	 */
	private String idUsuario;

	/**
	 * Atributo que indica el nombre del Usuario Logado
	 */
	private String nombreUsuario;

	/**
	 * Atributo que indica si el usario tiene el rol de Administracion
	 */
	private boolean esAdministrador;

	/**
	 * @return the esAdministrador
	 */
	public boolean isEsAdministrador() {
		return esAdministrador;
	}

	/**
	 * @param esAdministrador
	 *            the esAdministrador to set
	 */
	public void setEsAdministrador(boolean esAdministrador) {
		this.esAdministrador = esAdministrador;
	}

	/**
	 * @return the idUsuario
	 */
	public String getIdUsuario() {
		return idUsuario;
	}

	/**
	 * @param idUsuario
	 *            the idUsuario to set
	 */
	public void setIdUsuario(String idUsuario) {
		this.idUsuario = idUsuario;
	}

	/**
	 * @return the nombreUsuario
	 */
	public String getNombreUsuario() {
		return nombreUsuario;
	}

	/**
	 * @param nombreUsuario
	 *            the nombreUsuario to set
	 */
	public void setNombreUsuario(String nombreUsuario) {
		this.nombreUsuario = nombreUsuario;
	}

	/**
	 * Carga los Roles.
	 * 
	 * @return String
	 */
	public Roles cargarRoles() {

		Roles roles = new Roles();

		roles.setIdUsuario(idUsuario());
		roles.setNombreUsuario(nombreUsuario());
		roles.setEsAdministrador(esAdministrador());

		return roles;
	}

	/**
	 * Recupera el Nombre del Usuario Logado
	 * 
	 * @return String
	 */
	private String idUsuario() {

		Auditoria auditoria = new Auditoria();

		return auditoria.obtenerUsuario();
	}

	/**
	 * 
	 * @return
	 */
	public String nombreUsuario() {
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		// TODO - Recuperar el Nombre de Usuario.
		// if (auth != null) {
		// Object obj = auth.getPrincipal();
		// if (obj instanceof LdapUnavUserDetailsImpl) {
		// LdapUnavUserDetailsImpl ud = (LdapUnavUserDetailsImpl) obj;
		// return ud.getGivenName();
		// }
		// }
		return "";
	}

	/**
	 * Recupera las lista de Roles del usuario Logado
	 * 
	 * @return String
	 */
	private static List<String> getListaRoles() {

		ArrayList<String> lstRoles = new ArrayList<String>();

		Authentication auth = SecurityContextHolder.getContext().getAuthentication();

		if (auth != null) {
			Object obj = auth.getPrincipal();
			UserDetails ud = (UserDetails) obj;

			Iterator<GrantedAuthority> it = ud.getAuthorities().iterator();

			while (it.hasNext()) {

				GrantedAuthority ga = (GrantedAuthority) it.next();

				lstRoles.add(ga.getAuthority());
			}

		}

		return lstRoles;
	}

	/**
	 * Comprueba si el usuario logado es Administrador
	 * 
	 * @return boolean
	 */
	private static boolean esAdministrador() {

		boolean bSalida = false;

		ArrayList<String> lstRoles = (ArrayList<String>) getListaRoles();

		if (lstRoles.contains(ROLE_ADMIN)) {
			bSalida = true;
		}

		return bSalida;
	}

}
